#include "module_post_process.h"
#include "face_detect.h" 
#include "module_audio_postprocess.h"

extern "C"{
  #include "rk_list_process.h"
  #include "rk_init.h"

  #include "rtsp_demo.h"
  #include "rkmedia_api.h"
  #include "rkmedia_venc.h"
  
  #ifdef RKAIQ
  #include "sample_common.h"
  #endif
}

//初始化全局变量
rtsp_demo_handle g_rtsplive = NULL;
RK_CHAR *pIqfilesPath = NULL;
RK_S32 s32CamId = 0;
rknn_list *rknn_list_;  //目标检测的结果链表
struct demo_cfg cfg;    //两个会话的配置文件 
uint8_t person_id = 0;  //同样，下面直接调用库的方法应该放在一个中间层文件中，上层模块调用的时候调用其抽象即可。

//信号传递函数
int g_flag_run = 1;
static void sig_proc(int signo) {
  fprintf(stderr, "signal %d\n", signo);
  g_flag_run = 0;
}

static void sig_proc_sigsegv(int signo) {
  printf("signal %d\n", signo);
}

/*
    ---MAIN函数---
*/
int main(int argc, char **argv) {

  rkmedia_init(argc, argv);
  create_rknn_list(&rknn_list_);
  signal(SIGINT, sig_proc);
  //主线程中启动1号：后处理线程 和 2号：人脸检测线程
  pthread_t pthread_no_1;
  pthread_t pthread_no_2;
  pthread_t pthread_no_3;
  pthread_create(&pthread_no_1, NULL, module_post_process, NULL);
  pthread_create(&pthread_no_2, NULL, face_detector, NULL);
  pthread_create(&pthread_no_3, NULL, module_audio_postprocess, NULL);

  printf("This is main thread");

  signal(SIGSEGV, sig_proc_sigsegv);
  while (g_flag_run) {
    for (int i = 0; i < 1; i++) {           
      MEDIA_BUFFER buffer;
      // send video buffer
      buffer = RK_MPI_SYS_GetMediaBuffer(
          RK_ID_VENC, cfg.session_cfg[i].stVenChn.s32ChnId, 0);
      if (buffer) {
        rtsp_tx_video(cfg.session_cfg[i].session, (const uint8_t *)RK_MPI_MB_GetPtr(buffer),
                      RK_MPI_MB_GetSize(buffer),
                      RK_MPI_MB_GetTimestamp(buffer));
        RK_MPI_MB_ReleaseBuffer(buffer);
      }
    }
  rtsp_do_event(g_rtsplive);
}

  pthread_join(pthread_no_1, NULL);
  pthread_join(pthread_no_2, NULL);

  rtsp_del_demo(g_rtsplive);
  for (int i = 0; i < cfg.session_count; i++) {
    if (i != DRAW_INDEX)
      RK_MPI_SYS_UnBind(&cfg.session_cfg[i].stViChn,
                        &cfg.session_cfg[i].stVenChn);
    RK_MPI_VENC_DestroyChn(cfg.session_cfg[i].stVenChn.s32ChnId);
    RK_MPI_VI_DisableChn(s32CamId, cfg.session_cfg[i].stViChn.s32ChnId);
  }

  if (pIqfilesPath) {
#ifdef RKAIQ
    SAMPLE_COMM_ISP_Stop(s32CamId);
#endif
  }

  destory_rknn_list(&rknn_list_);
  return 0;
}
